package modelo.vehiculos;

import modelo.improvistos.Improvisto;
import modelo.jugador.Jugador;
import modelo.tablero.Ciudad;

public abstract class Vehiculo{

	private Ciudad mapa;
	private Posicion posicion;
	private Jugador conductor;
	private boolean gano = false;

	public Vehiculo(Ciudad nuevoMapa, Posicion unaPosicion, Jugador unConductor){
		this.posicion = unaPosicion;
		this.mapa = nuevoMapa;
		this.conductor = unConductor;
		this.conductor.setMovil(this); //El conductor sabe que vehiculo conduce
	}

	public Posicion getPosicion(){
		return posicion;
	}

	public Ciudad getCiudad(){
		return mapa;
	}

	public Jugador getConductor(){
		return conductor;
	}
	
	public boolean esGanador(){
		return gano;
	}
	
	public void setMapa(Ciudad unMap){
		mapa = unMap;
	}
	
	public void setPos(Posicion unaPos){
		posicion = unaPos;
	}
	
	public void gano(){
		gano=true;
	}
	
	
	private void recorrerCuadra(int coordenadaX , int coordenadaY, int moverX, int moverY){
		Improvisto unImprovisto = mapa.getImprovisto(coordenadaX, coordenadaY);
		this.aplicarImprovisto(unImprovisto,moverX,moverY);
	}
	
	abstract void aplicarImprovisto(Improvisto unImprovisto,int moverX,int moverY);
	
	public void mover(int deltaX, int deltaY){
		posicion.trasladar(deltaX, deltaY);
	}
	
	public void moverAdelante(){
		if((posicion.getY() < mapa.getCols()) || (mapa.getFilMeta()== 2*posicion.getX()-2)){
			recorrerCuadra(2*posicion.getX()-2, posicion.getY()-1,0,1);
			conductor.aumentarMovsEn(1);
			conductor.setLlego(this.esGanador());
		}
	}

	public void moverAtras(){
		if(posicion.getY() > 1){
			recorrerCuadra(2*posicion.getX()-2, posicion.getY()-2,0,-1);
			conductor.aumentarMovsEn(1);
			conductor.setLlego(this.esGanador());
		}
	}

	public void moverArriba(){
		if(posicion.getX() > 1){
			recorrerCuadra(2*posicion.getX()-3, posicion.getY()-1,-1,0);
			conductor.aumentarMovsEn(1);
			conductor.setLlego(this.esGanador());
		}
	}

	public void moverAbajo(){
		if(posicion.getX() < mapa.getFilas()){
			recorrerCuadra(2*posicion.getX()-1, posicion.getY()-1,1,0);
			conductor.aumentarMovsEn(1);
			conductor.setLlego(this.esGanador());
		}
	}

}
